﻿namespace Fetches.Fetch.Utils.IdGenerator
{
    public class IdConverter
    {
        public long Convert(Id id, IdMeta idMeta)
        {
            return DoConvert(id, idMeta);
        }

        protected long DoConvert(Id id, IdMeta idMeta)
        {
            long ret = 0;

            ret |= id.Machine;

            ret |= id.Seq << idMeta.GetSeqBitsStartPos();

            ret |= id.Time << idMeta.GetTimeBitsStartPos();

            ret |= id.GenMethod<< idMeta.GetGenMethodBitsStartPos();

            ret |= id.Type << idMeta.GetTypeBitsStartPos();

            ret |= id.Version << idMeta.GetVersionBitsStartPos();

            return ret;
        }

        public Id Convert(long id, IdMeta idMeta)
        {
            return DoConvert(id, idMeta);
        }

        protected Id DoConvert(long id, IdMeta idMeta)
        {
            var ret = new Id
            {
                Machine = id & idMeta.GetMachineBitsMask(),
                Seq = (id >> idMeta.GetSeqBitsStartPos()) & idMeta.GetSeqBitsMask(),
                Time = (id >> idMeta.GetTimeBitsStartPos()) & idMeta.GetTimeBitsMask(),
                GenMethod = (id >> idMeta.GetGenMethodBitsStartPos()) & idMeta.GetGenMethodBitsMask(),
                Type = (id >> idMeta.GetTypeBitsStartPos()) & idMeta.GetTypeBitsMask(),
                Version = (id >> idMeta.GetVersionBitsStartPos()) & idMeta.GetVersionBitsMask()
            };
            return ret;
        }
    }
}
